package principal;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import objetsRadar.Traitement;
import visualisationRadar.VisualisationRadar;

import modelesObjet.ModeleEchelle;
import modelesObjet.ModeleImageRadar;
import modelesObjet.ModeleListePixels;
import modelesObjet.ModeleMire;

/**
 * Classe abstraite servant de "base" à la création des 4 types d'images.
 * 
 * @author laurent & kevin
 * 
 */
public class ImageRadar implements ModeleImageRadar {

	public ImageRadar(File fichier, ListeDonnees listeDonnees, int type) {
		this.fichier = fichier;
		this.type = type;
		radar = FileFactory.getRadar(fichier);
		dateDebut = FileFactory.getDateDebut(fichier);
		dateFin = FileFactory.getDateFin(fichier);
		try {
			fondCarte = FondCarteFactory.getFondCarte(radar);
		} catch (FileNotFoundException e) {
		}
		this.listeDonnees = listeDonnees;
		echelle = EchelleFactory.getEchelle(type);
		mire = MireFactory.getMire(type);
		listePixels = new ListePixels(this.listeDonnees, echelle);
	}

	@Override
	public FondCarte getFondCarte() {
		return fondCarte;
	}

	/**
	 * Renvoie le texte affiché sous la mire.
	 */
	@Override
	public String getChaine() {
		if (type == VisualisationRadar.RR || type == VisualisationRadar.QUALITE) {
			return radar + "\nle " + FileFactory.dateToFormatHumain(dateFin);
			
		} else {
			return radar + "\ndu " + FileFactory.dateToFormatHumain(dateDebut) + "\nau " + FileFactory.dateToFormatHumain(dateFin);
		}
	}

	/**
	 * Lit les données si le fichier entré en paramètre du constructeur existe.
	 * Ne le fait que la 1ere fois où cette méthode est appelée.
	 */
	@Override
	public ListeDonnees getDonnees() {
		if (listeDonnees == null) {
			if (fichier.exists()) {
				try {
					listeDonnees = new ListeDonnees(Traitement.lireFichier(
							fichier.getName(), type));
				} catch (IOException e) {
					// TODO Auto-generated catch block
					listeDonnees = null;
				}
			}
		}
		return listeDonnees;
	}

	@Override
	public int getType() {
		return type;
	}

	/**
	 * Renvoie la liste de pluviometres. Renvoie null si la liste de pluvios est
	 * vide.
	 */
	@Override
	public ListePluviometres getPluviometres() {
		listePluviometres = ListePluviometresFactory.getListesPluviometres(
				radar, dateFin);
		if (listePluviometres.getVecteurPluviometres() == null)
			return null;
		return listePluviometres;
	}

	/**
	 * Renvoie la date de fin du cumul. Les fichiers cumul 5 min ne sont
	 * identifiés que par une seule date et c'est celle-ci.
	 */
	@Override
	public Date getDate() {
		return dateFin;
	}

	/**
	 * Utilisée pour les cumuls > à 5min.
	 * 
	 */
	public Date getDateDebut() {
		return dateDebut;
	}

	@Override
	public ModeleMire getMire() {
		return mire;
	}

	@Override
	public ModeleEchelle getEchelle() {
		return echelle;
	}

	@Override
	public ModeleListePixels getPixels() {
		return listePixels;
	}

	protected void setListePixels(ListePixels listePixels) {
		this.listePixels = listePixels;
	}

	protected void setListeDonnees(ListeDonnees ld) {
		this.listeDonnees = ld;
	}

	public String getRadar() {
		return radar;
	}

	public ImageRadar switchQualiteRR() {
		return null;
	}

	public File getFile() {
		return fichier;
	}

	public boolean deplace(int i) {
		dateFin = FileFactory.changeDate(dateFin, Calendar.MINUTE, i);
		fichier = new File(FileFactory.buildFileString(radar, dateFin, type));
		listeDonnees = null;
		listePixels = new ListePixels(this.getDonnees(), echelle);
		listePluviometres = ListePluviometresFactory.getListesPluviometres(
				radar, dateFin);
		if (!fichier.exists()) {
			System.out.println("Le fichier " + fichier + " est absent.");
			return false;
		}
		return true;

	}

	@Override
	public String getNomFichier() {
		return fichier.getName();
	}

	private FondCarte fondCarte;
	private ListeDonnees listeDonnees = null;
	private ListePluviometres listePluviometres;
	private int type;
	private String radar;
	private Date dateDebut, dateFin;
	private Mire mire;
	private Echelle echelle;
	private ListePixels listePixels;
	private File fichier;
}
